home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / warp / bang.c next >
Encoding:
C/C++ Source or Header  |  1995-05-03  |  2.8 KB  |  154 lines

  1. /* $Header: bang.c,v 7.0.1.3 86/12/12 16:57:00 lwall Exp $ */
  2.  
  3. /* $Log:    bang.c,v $
  4.  * Revision 7.0.1.3  86/12/12  16:57:00  lwall
  5.  * Made circular explosions.
  6.  * 
  7.  * Revision 7.0.1.2  86/10/20  14:36:02  lwall
  8.  * Picked some lint.
  9.  * 
  10.  * Revision 7.0.1.1  86/10/16  10:49:45  lwall
  11.  * Added Damage.  Fixed random bugs.
  12.  * 
  13.  * Revision 7.0  86/10/08  15:11:57  lwall
  14.  * Split into separate files.  Added amoebas and pirates.
  15.  * 
  16.  */
  17.  
  18. #include "EXTERN.h"
  19. #include "warp.h"
  20. #include "object.h"
  21. #include "move.h"
  22. #include "sig.h"
  23. #include "term.h"
  24. #include "them.h"
  25. #include "INTERN.h"
  26. #include "bang.h"
  27.  
  28. void
  29. bang_init()
  30. {
  31.     ;
  32. }
  33.  
  34. void
  35. make_plink(y,x)
  36. Reg1 int x;
  37. Reg2 int y;
  38. {
  39.     Reg3 OBJECT *obj;
  40.  
  41.     move(y+1,x*2,0);
  42.     beg_qwrite();
  43.     *filler = '@';
  44.     qwrite();
  45.     obj = occupant[y][x];
  46.     if (obj) {
  47.     if (numamoebas && obj->image == ' ')
  48.         qaddc(amb[y][x]);
  49.     else
  50.         qaddc(obj->image);
  51.     }
  52.     else if (numamoebas)
  53.     qaddc(amb[y][x]);
  54.     else
  55.     qaddspace();
  56.     end_qwrite();
  57. }
  58.  
  59. void
  60. make_blast(y,x,mass,size)
  61. Reg1 int x;
  62. Reg2 int y;
  63. int size;
  64. long mass;
  65. {
  66.     bangy[nxtbang] = y;
  67.     bangx[nxtbang] = x;
  68.     bangm[nxtbang] = mass;
  69.     bangs[nxtbang++] = size;
  70.     assert(nxtbang <= XSIZE * YSIZE);
  71.     if (numamoebas && amb[y][x] == '~') {
  72.     if (mass > 10000)
  73.         modify_amoeba(y,x,1,'~', 10);
  74.     else if (mass > 100)
  75.         modify_amoeba(y,x,1,'~', 5);
  76.     bangs[nxtbang-1] = 0;        /* don't propagate */
  77.     return;
  78.     }
  79.     else if (mass >= 0) {
  80.     Reg3 OBJECT *obj;
  81.  
  82.     move(y+1,x*2,0);
  83.     beg_qwrite();
  84.     *filler = '@';
  85.     qwrite();
  86.     *filler = '#';
  87.     qwrite();
  88.     *filler = '@';
  89.     qwrite();
  90.     *filler = '#';
  91.     qwrite();
  92.     *filler = '@';
  93.     qwrite();
  94.     obj = occupant[y][x];
  95.     if (obj) {
  96.         if (numamoebas && obj->image == ' ')
  97.         qaddc(amb[y][x]);
  98.         else
  99.         qaddc(obj->image);
  100.     }
  101.     else if (numamoebas)
  102.         qaddc(amb[y][x]);
  103.     else
  104.         qaddspace();
  105.     end_qwrite();
  106.     }
  107. }
  108.  
  109. void
  110. do_bangs()
  111. {
  112.     Reg1 int x;
  113.     Reg2 int y;
  114.     Reg3 int i;
  115.     Reg4 int j;
  116.     Reg7 int k;
  117.     Reg5 int lastxy;
  118.     Reg6 OBJECT *obj;
  119.  
  120.     /* read blast list and update blast array */
  121.     assert(nxtbang >= 0 && nxtbang <= XSIZE * YSIZE);
  122.     for (i=0; i<nxtbang; i++) {
  123.     if (bangm[i] != 32767)
  124.         bangm[i] *= 4;
  125.     lastxy = bangs[i] << 1;
  126.     if (lastxy >= MAXBDIST)
  127.         lastxy = MAXBDIST - 1;
  128.     for (y=bangy[i]-bangs[i],x=bangx[i]-bangs[i],j=lastxy;
  129.       j>=0;
  130.       y++,x++,--j) {
  131.         yblasted[yy[j] = (y+YSIZE00) % YSIZE] |= 1;
  132.         xblasted[xx[j] = (x+XSIZE00) % XSIZE] |= 1;
  133.     }
  134.     blasted = TRUE;
  135.     for (y=lastxy;y>=0;--y) {
  136.         for (x=lastxy;x>=0;--x) {
  137.         if (lastxy > 2) {
  138.             j = abs(y-bangs[i]);
  139.             k = abs(x-bangs[i]);
  140.             if (j < k)        /* distance is long + 1/2 short */
  141.             j += k + k;
  142.             else
  143.             j += j + k;
  144.             if (--j > lastxy)
  145.             continue;
  146.         }
  147.         if (bangm[i] != 32767 ||
  148.           !(obj=occupant[yy[y]][xx[x]]) || obj->type != Web)
  149.             blast[yy[y]][xx[x]] += bangm[i];
  150.         }
  151.     }
  152.     }
  153. }
  154.